import { defineStore } from 'pinia'
import { ref } from 'vue'
import { User } from '../type/user'
import { login as apiLogin, getUserInfo as apiGetUserInfo } from '@/api/profile'
import cookie from 'js-cookie'
import authService from '@/utils/authService'

export const useProfileStore = defineStore('user', () => {
  const user = ref({} as User)
  const isLoggedIn = ref(false)
  // 添加优惠券信息存储
  const couponInfo = ref<{
    ids: string[],
    names: string[]
  } | null>(null)

  // 登录方法
  async function login(account: string, password: string) {
    try {
      // 根据登录方式构建请求数据
      let loginData: { username?: string, phone?: string, email?: string, password: string } = { password };
      
      // 判断是哪种登录方式
      if (/^1[3-9]\d{9}$/.test(account)) {
        // 手机号登录
        loginData.phone = account;
      } else if (/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(account)) {
        // 邮箱登录
        loginData.email = account;
      } else {
        // 用户名登录
        loginData.username = account;
      }

      // 使用authService进行登录
      const response = await authService.login(loginData);
      
      // 检查登录是否成功
      if (response.code !== 200) {
        throw new Error(response.msg || '登录失败');
      }
      
      // 获取用户信息
      await fetchUserInfo();
      
      isLoggedIn.value = true;
      return { success: true, message: '登录成功' };
    } catch (error: any) {
      // 清除可能存在的无效token
      authService.logout();
      
      // 根据错误类型返回相应的错误信息
      if (error.response && error.response.data) {
        throw new Error(error.response.data.msg || '登录失败');
      }
      throw error;
    }
  }

  // 获取用户信息
  async function fetchUserInfo() {
    try {
      const response = await apiGetUserInfo();
      
      // 检查获取用户信息是否成功
      if (response.data.code !== 200) {
        throw new Error(response.data.msg || '获取用户信息失败');
      }
      
      user.value = response.data.data;
    } catch (error: any) {
      console.error('获取用户信息失败:', error);
      
      // 如果是token过期或无效导致的错误，清除token并更新登录状态
      if (error.response && (error.response.status === 401 || error.response.status === 403)) {
        authService.logout();
        isLoggedIn.value = false;
      }
      
      throw error;
    }
  }

  // 验证token有效性
  async function validateToken() {
    // 只有当当前状态为已登录且有用户信息时才验证
    if (!isLoggedIn.value && Object.keys(user.value).length === 0) {
      // 先检查是否有token
      const token = cookie.get('token');
      if (!token) {
        return false;
      }
    }
    
    try {
      // 尝试获取用户信息来验证token是否有效
      await fetchUserInfo();
      isLoggedIn.value = true;
      return true;
    } catch (error) {
      // token无效，清除本地存储
      logout();
      return false;
    }
  }

  // 退出登录方法
  function logout() {
    user.value = {} as User
    isLoggedIn.value = false
    couponInfo.value = null // 清除优惠券信息
    authService.logout();
  }
  
  // 退出登录方法（避免循环调用）
  function logoutWithoutAuth() {
    user.value = {} as User
    isLoggedIn.value = false
    couponInfo.value = null // 清除优惠券信息
    // 注意：这里不调用 authService.logout() 以避免循环调用
  }

  // 检查登录状态
  async function checkLoginStatus() {
    const token = cookie.get('token');
    if (token) {
      // 如果有token，验证其有效性
      const isValid = await validateToken();
      isLoggedIn.value = isValid;
    } else {
      isLoggedIn.value = false;
    }
  }
  
  // 添加设置优惠券信息的方法
  function setCouponInfo(info: { ids: string[], names: string[] } | null) {
    couponInfo.value = info
  }

  return { 
    user, 
    isLoggedIn, 
    couponInfo, // 导出优惠券信息
    fetchUserInfo, 
    login, 
    logout, 
    logoutWithoutAuth, // 导出新方法
    validateToken, 
    checkLoginStatus,
    setCouponInfo // 导出设置优惠券信息的方法
  }
})